home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.1 (Developer) [x86] / NeXT Step 3.1 Intel dev.cdr.dmg / NextDeveloper / Examples / AppKit / Graph / PointMesh.m < prev    next >
Text File  |  1992-06-21  |  2KB  |  78 lines

  1.  
  2. /*
  3.     PointMesh.m
  4.  
  5.     A PointMesh takes an array of points in three dimensional space and renders
  6.     them as surface in space space using a Renderman bilinear patch mesh.
  7.  
  8.     You may freely copy, distribute, and reuse the code in this example.
  9.     NeXT disclaims any warranty of any kind, expressed or implied, as to its
  10.     fitness for any particular use.
  11. */
  12.  
  13. #import "Graph.h"
  14.  
  15. @implementation PointMesh
  16.  
  17. - init {
  18.     self = [super init];
  19.     color = NX_COLORWHITE;
  20.     return self;
  21. }
  22.  
  23. - free {
  24.     free(points);
  25.     return [super free];
  26. }
  27.  
  28. /*
  29.  * This copies ther given points into a 2D array that is formatted correctly
  30.  * for the RiPatchMesh() call we use to render the patch (below).
  31.  */
  32. - setPointsX:(float *)x y:(float *)y z:(float *)z
  33.     minX:(float)minX minY:(float)minY minZ:(float)minZ
  34.     maxX:(float)maxX maxY:(float)maxY maxZ:(float)maxZ
  35.     numU:(int)numU numV:(int)numV {
  36.     int i;
  37.     int totalPoints = numU * numV;
  38.  
  39.     uCount = numU;
  40.     vCount = numV;
  41.     free(points);
  42.     points = NXZoneMalloc([self zone], totalPoints * sizeof(RtPoint));
  43.  
  44.     for (i = 0; i < totalPoints; i++) {
  45.     points[i][0] = x[i];
  46.     points[i][1] = y[i];
  47.     points[i][2] = z[i];
  48.     }
  49.     return self;
  50. }
  51.  
  52. /*
  53.  * This method is called whenever the shape needs to render itself (its
  54.  * analogous to View's drawSelf:: method).  The patch renders itself by
  55.  * setting the surface type and the color, and then emitting one big bilinear
  56.  * patch mesh containing all our data points.
  57.  */
  58. - renderSelf:(RtToken)context {
  59.     static RtColor rgbColor;
  60.     
  61.     RiSurface("plastic", RI_NULL);
  62.     NXConvertColorToRGB(color, &rgbColor[0], &rgbColor[1], &rgbColor[2]);
  63.     RiColor(rgbColor);
  64.     RiPatchMesh(RI_BILINEAR, uCount, RI_NONPERIODIC, vCount, RI_NONPERIODIC, RI_P, points, RI_NULL);
  65.     return self;
  66. }
  67.  
  68. - setColor:(NXColor)newColor {
  69.     color = newColor;
  70.     return self;
  71. }
  72.  
  73. - (NXColor)color {
  74.     return color;
  75. }
  76.  
  77. @end
  78.